
#ifndef __RTP_H__
#define __RTP_H__
//标准RTP头结构
/*
V ― 版本。识别 RTP 版本。
P ― 间隙（Padding）。设置时，数据包包含一个或多个附加间隙位组，其中这部分不属于有效载荷。
X ― 扩展位。设置时，在固定头后面，根据指定格式设置一个扩展头。
CSRC Count ― 包含 CSRC 标识符（在固定头后）的编号。
M ― 标记。标记由 Profile 文件定义。允许重要事件如帧边界在数据包流中进行标记。
Payload Type ― 识别 RTP 有效载荷的格式，并通过应用程序决定其解释。Profile 文件规定了从 Payload 编码到 Payload 格式的缺省静态映射。另外的 Payload Type 编码可能通过非 RTP 方法实现动态定义。
Sequence Number ― 每发送一个 RTP 数据包，序列号增加1。接收方可以依次检测数据包的丢失并恢复数据包序列。
Timestamp ― 反映 RTP 数据包中的第一个八位组的采样时间。采样时间必须通过时钟及时提供线性无变化增量获取，以支持同步和抖动计算。
SSRC ― 同步源。该标识符随机选择，旨在确保在同一个 RTP 会话中不存在两个同步源具有相同的 SSRC 标识符。
CSRC ― 贡献源标识符。识别该数据包中的有效载荷的贡献源。
*/
typedef struct RtpHead
{
  //---------
  unsigned char version : 2;
  unsigned char padding : 1;
  unsigned char extension : 1;
  unsigned char csrcCount : 4; //0=没有csrcs ，csrcs不存在
  //-----------
  unsigned char marker : 1;
  unsigned char payloadType : 7; //98 h264video，96 aac
  //----------------------
  unsigned short sequenceNumber; //16bits  dts
  //---------
  //以上4字节
  unsigned int timestamp; //32    pts
  unsigned int ssrc;      //32 服务端播放标识符 如源改变源传输地址，也必须选择一个新SSRC标识以避免插入成环行源
  //以上12字节固定头
  //unsigned int csrc[];      //32 数据来源 0到15项CSRC，每项32位。CC项记录有多少个CSRC项。CSRC列表表示包内的对载荷起作用的源。如超出15个作用源，也仅标识15个。CSRC标识由混合器插入，采用作用源的SSRC标识。

} RtpHead;
//-----------------------------------
//DPE的rtp头 和标准rtp头有所不同
/*
  bytes		意义
  1				0x24
  2				0x00
  3-4			整个rtp包的长度 16位
  5				0x80
  6				98 h264video， 96 aac
  7-8			当前帧的序号和时间戳 SequenceNumber   客户端传入 ，16位
  9-12		timestamp int  32bit
  13-16		ssrc服务端下发的流标识
 */
typedef struct DinaRtpHead
{
  unsigned short version; //0x24 0x00
  unsigned short rtpPackageSize;
  unsigned char tag;             //0x80
  unsigned char payloadType;     //98 h264video，96 aac
  unsigned short sequenceNumber; //16bits  dts
                                 //以上8字节
  //32    pts
  unsigned int timestamp; 
  
  //32 服务端播放标识符 如源改变源传输地址，也必须选择一个新SSRC标识以避免插入成环行源
  unsigned int ssrc;
   //以上16字节固定头

} DinaRtpHead;

//------------------
unsigned int readDinaRtpHead(unsigned char *buf, int bufSize, DinaRtpHead *outRtpHead);

//载荷类型
extern const unsigned int PAYLOAD_TYPE_VIDEO_H264;
extern const unsigned int PAYLOAD_TYPE_VIDEO_H265;
extern const unsigned int PAYLOAD_TYPE_AUDIO_AAC;

#endif